AWS Security Hubで、アカウント集約の設定を簡単に行うスクリプトを作った
AWS Security Hubの管理機能として、アカウント集約とリージョン集約があります。
- 管理者アカウントおよびメンバーアカウントの管理 - AWS Security Hub
- 【アップデート】AWS Security Hub が検出結果のリージョン集約に対応しました | DevelopersIO
これらを組み合わせて使う場合には、リージョン毎にアカウント集約の設定を行う必要があるようです。 AWSアカウントが複数ある場合には、それぞれのアカウント・それぞれのリージョンで招待&承認の操作が必要になり、とても手間です。 というわけで、招待&承認を行うスクリプトを作ってみました。
なお、定期チェックされるタイミングで集約先のリージョンや管理アカウントに反映されるようなので、設定結果の反映確認は、しばらく待つ必要があります。
おすすめの方
- AWS Security Hubでアカウント集約をしたい方
それぞれのリージョンで招待&承認する操作の例
手作業でポチポチするのは大変です……。
招待する側の操作
- 管理アカウントAのリージョン1で、メンバーアカウントXを招待する
- 管理アカウントAのリージョン1で、メンバーアカウントYを招待する
- 管理アカウントAのリージョン1で、メンバーアカウントZを招待する
- 管理アカウントAのリージョン2で、メンバーアカウントXを招待する
- 管理アカウントAのリージョン2で、メンバーアカウントYを招待する
- 管理アカウントAのリージョン2で、メンバーアカウントZを招待する
- 以下略
承認する側の操作
- メンバーアカウントXのリージョン1で、招待を承認する
- メンバーアカウントXのリージョン2で、招待を承認する
- メンバーアカウントYのリージョン1で、招待を承認する
- メンバーアカウントYのリージョン2で、招待を承認する
- メンバーアカウントZのリージョン1で、招待を承認する
- メンバーアカウントZのリージョン2で、招待を承認する
- 以下略
招待&承認を行うスクリプト
招待する側
招待する側のAWSアカウントで、下記を実行します。
AWS_MEMBER_ACOUNT_IDS
には、招待したいAWSアカウントIDを記載します。
import boto3 AWS_MEMBER_ACOUNT_IDS = [ '999999999999', '888888888888', '777777777777', ] def main(): ec2 = boto3.client('ec2') regions = ec2.describe_regions()['Regions'] for region in regions: region_name = region['RegionName'] print(region_name) securityhub = boto3.client('securityhub', region_name=region_name) # メンバーアカウントを追加する for account_id in AWS_MEMBER_ACOUNT_IDS: securityhub.create_members( AccountDetails=[{'AccountId': account_id}] ) # メンバーアカウントを招待する securityhub.invite_members( AccountIds=AWS_MEMBER_ACOUNT_IDS ) if __name__=='__main__': main()
python invite.py
承認する側
承認する側のAWSアカウントそれぞれで、下記を実行します。
AWS_ADMIN_ACOUNT_ID
は、さきほど招待した側のAWSアカウントIDを記載します。
import boto3 AWS_ADMIN_ACOUNT_ID = '111111111111' def main(): ec2 = boto3.client('ec2') regions = ec2.describe_regions()['Regions'] for region in regions: region_name = region['RegionName'] print(region_name) securityhub = boto3.client('securityhub', region_name=region_name) # メンバーアカウントの招待を確認する resp = securityhub.list_invitations() # メンバーアカウントの招待を承認する securityhub.accept_administrator_invitation( AdministratorId=AWS_ADMIN_ACOUNT_ID, InvitationId=resp['Invitations'][0]['InvitationId'] ) if __name__=='__main__': main()
python accept.py
さいごに
AWSアカウントの各リージョンで招待&承認をするスクリプトを作って、自動化してみました。時間短縮の助けになれば幸いです。